package com.qf.contorller;

import com.qf.pojo.Goods;
import com.qf.service.GoodsService;
import com.qf.service.GoodsServiceImpl;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * @author LiXuekai on 2022/5/24
 */
@WebServlet("/goods")

public class GoodsController extends BaseServlet {
    /**
     * 跳转到首页
     *
     * @param request
     * @param response
     * @return
     */
    public String index(HttpServletRequest request, HttpServletResponse response) {
        //1.调用servlet查询所有的商品数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();
        //2.将商品数据存入到request域对象中
        request.setAttribute("goodsList", list);
        return "forward:/index.jsp";
    }

    /**
     * 跳转到商品详情页面
     *
     * @param request
     * @param response
     * @return
     */
    public String detail(HttpServletRequest request, HttpServletResponse response) {
        //1 接受传入的参数 商品的id
        String id = request.getParameter("id");
        //2根据商品的id查询商品的详细信息
        GoodsService goodsService = new GoodsServiceImpl();
        Goods goods = goodsService.findGoodsById(Integer.parseInt(id));
        //3.将查询到的商品放入到resquest请求域对象中 带给页面展示使用
        request.setAttribute("goods",goods);
        //4.请求转发到商品的详情页面
        return "forward:/goodsDetail.jsp";
    }

    /**
     * 查询商品列表
     *
     * @param request
     * @param response
     * @return
     */
    public String show(HttpServletRequest request, HttpServletResponse response) {
        //1.调用service 查询所有的商品数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();
        //2.将商品数据存入到request域对象中
        request.setAttribute("goodsList", list);
        //3.利用请求转发跳转到到查询页面 并将request域中的对象带到页面中展示
        return "forward:/admin/showGoods.jsp";
    }

    /**
     * 商品添加并带图片上传功能
     *
     * @param request
     * @param response
     * @return
     */
    public String addGoods(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //1.创建工厂类解析对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.从工厂类获取解析器对象
        ServletFileUpload parser = new ServletFileUpload(factory);
        //3.解决文件名的乱码问题
        parser.setHeaderEncoding("utf-8");
        //4.判断上传的表单类型 如果表单中带enctype="multipart/form-data  " 说明是有文件上传
        //如果没有上传图片文件 添加失败 跳转到管理员登陆界面
        if (!ServletFileUpload.isMultipartContent(request)) {
            return "redircet:/admin/admin.jsp";
        }
        //5.调用解析器上传数据
        List<FileItem> fileItems = parser.parseRequest(request);


        //6获取保存文件的本地服务器路径
        //上传到项目编译后的位置 比如D://java2203/java2203/myshop/files/
        String uploadPath = request.getServletContext().getRealPath("/files");
        System.out.println("图片的上传后的位置" + uploadPath);
        //7判断服务器目录是否存在  如果目录不存在自动创建文件夹
        File fileDir = new File(uploadPath);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }
        ///8创建Good商品对象
        Goods goods = new Goods();
        //9.遍历表单中的每一个元素 将表单的数据存入到Goods商品对象
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()) {
                //10判断如果是普通表单 将表单数据存入Goods商品对象中
                if (fileItem.getString() == null || "".equals(fileItem.getString())) {
                    continue;
                }
                //如果是商品分类放入goods对象中
                if ("typeid".equals(fileItem.getFieldName())) {
                    goods.setTid(Integer.parseInt(fileItem.getString()));
                }

                //商品名称
                if ("name".equals(fileItem.getFieldName())) {

                    goods.setName(new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8"));

                }
                //商品创建时间
                if ("pubdate".equals(fileItem.getFieldName())) {
                    String dateString = fileItem.getString();
                    //日期格式化
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    goods.setPubdate(sdf.parse(dateString));
                } //商品价格
                if ("price".equals(fileItem.getFieldName())) {
                    goods.setPrice(Integer.parseInt(fileItem.getString()));
                } //商品评分
                if ("star".equals(fileItem.getFieldName())) {
                    goods.setStar(Integer.parseInt(fileItem.getString()));
                }
                //商品简介
                if ("intro".equals(fileItem.getFieldName())) {

                    goods.setIntro(new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8"));

                }

            } else {
                //11判断是否是文件 如果是文件  获取上传文件的路径和文件名
                //c://xxx//xxx//xxx//.jpg
                String filePath = fileItem.getName();
                //12如果未上传文件 继续处理下一个字段
                if (filePath == null || "".equals(filePath)) {
                    continue;
                }
                //13获取上传文件的文件名
                String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
                //14 做io操作 保存文件到指定服务器位置 获取输入流的位置 获取输入流读取文件
                InputStream inputStream = fileItem.getInputStream();
                //15 将文件保存在服务器硬盘目录+文件名  组成的具体路径
                FileOutputStream out = new FileOutputStream(uploadPath + "\\" + fileName);
                System.out.println("文件保存后的完整路径" + uploadPath + "\\" + fileName);
                //创建缓冲区
                byte[] buffer = new byte[1024];
                //读取的长度
                int len;
                //如果读取的长度大于0 说明读取出来内容了  可以输出
                while ((len = inputStream.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.close();
                inputStream.close();
                //16保存后设置Goods商品对象中图片保存后的路径和文件名信息
                //http://localhost:8080/files/xxx.jpg
                goods.setPicture("http://localhost:8080/filse/" + fileName);

            }
        }
        //17调用service  保存goods商品对象到数据库的商品表中
        GoodsService goodsService = new GoodsServiceImpl();
        goodsService.addGoods(goods);
        //18  跳转到商品查看界面
        return "redirect:/admin/showGoods.jsp";
    }


}